/**
 * @file bsp_uart_v2.h
 * @brief 新版UART封装驱动
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-10-10
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __BSP_UART_V2_H
#define __BSP_UART_V2_H
#include <stdint.h>
#include <stdbool.h>
#include "bsp.h"
#include "app_fifo.h"
#include "bsp_gpio.h"

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

/**
 * @brief UART外设编号
 */
typedef enum
{
    UART_1,
    UART_2,
    UART_3,
    UART_4,
    UART_5,
}UartId_t;

/**
 * @brief UART工作模式
 */
typedef enum
{
    TX_ONLY = 1,
    RX_ONLY,
    RX_TX
}UartMode_t;

/**
 * @brief UART参数字长度
 */
typedef enum
{
    UART_8_BIT = 1,
    UART_9_BIT
}WordLength_t;

/**
 * @brief UART参数停止位
 */
typedef enum
{
    UART_1_STOP_BIT = 1,
    UART_0_5_STOP_BIT,
    UART_2_STOP_BIT,
    UART_1_5_STOP_BIT
}StopBits_t;

/**
 * @brief UART参数校验位
 */
typedef enum
{
    NO_PARITY = 1,
    EVEN_PARITY,
    ODD_PARITY
}Parity_t;

/**
 * @brief UART流控制
 */
typedef enum
{
    NO_FLOW_CTRL = 1,
    RTS_FLOW_CTRL,
    CTS_FLOW_CTRL,
    RTS_CTS_FLOW_CTRL
}FlowCtrl_t;

/** @brief UART配置参数结构体 */
typedef struct UartParam_s
{
    uint32_t baudrate;
    UartMode_t mode;
    WordLength_t wordLength;
    StopBits_t stopBits;
    Parity_t parity;
    FlowCtrl_t flowCtrl;
} UartParam_t;

/**
 * @brief UART对象结构体
 */
typedef struct Uart_s
{
#ifdef STM32F10X
    USART_TypeDef* USARTx;
    // USART_InitTypeDef USART_InitStructure;
#elif defined GD32F10X
    uint32_t USARTx;	///< UART外设
#endif
    UartId_t UartId;	///< UART外设编号
    bool IsInitialized;
    Gpio_t Tx;
    Gpio_t Rx;

    // app_fifo_t FifoTx;
    app_fifo_t FifoRx;
    uint8_t *FifoRx_buf;
    uint16_t FifoRx_size;

    UartParam_t param;

#ifdef STM32F10X
    DMA_Channel_TypeDef* UART_RX_DMA_Channel;
#elif defined GD32F10X
    uint32_t dma_periph;
	uint8_t dma_channel;
#endif
    uint32_t DMA_PeripheralAddr;
    uint32_t UART_DMA_FLAG;
    uint8_t *dmaRx_buf;
    uint32_t dmaRx_size;

    SemaphoreHandle_t uartRxSemaphore;
    SemaphoreHandle_t uartTxLock;
}Uart_t;




/**
 * @brief UART初始化
 * @warning 串口引脚要与外设编号严格对应，驱动未作匹配校验
 * @param[in]  uartId   UART编号
 * @param[in]  tx       TX引脚
 * @param[in]  rx       RX引脚
 * @param[in]  maxRxSize 接收最大帧长(This size must be a power of two)
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_ALREADY_INIT - 已初始化
 * - @ref BSP_ERROR_NO_MEM - 内存出错
 */
int8_t UartInit( UartId_t uartId, PinNames tx, PinNames rx, uint16_t maxRxSize );

/**
 * @brief UART去初始化
 * @param  uartId      UART编号
 */
void UartDeInit( UartId_t uartId );

/**
 * @brief UART硬件外设初始化（可用于重新初始化或复位UART）
 * @param[in]  uartId   UART编号
 */
void UartReset( UartId_t uartId );

/**
 * @brief UART参数配置
 * @param  uartId      UART编号
 * @param  mode        UART工作模式
 * @param  baudrate    波特率
 * @param  wordLength  传输字长度
 * @param  stopBits    停止位
 * @param  parity      校验位
 * @param  flowCtrl    流控
 */
int8_t UartConfig( UartId_t uartId, UartMode_t mode, uint32_t baudrate, WordLength_t wordLength, StopBits_t stopBits, Parity_t parity, FlowCtrl_t flowCtrl );

/**
 * @brief UART发送
 * @param[in]  uartId       UART编号
 * @param[in]  buffer       发送数据指针
 * @param[in]  size         发送数据长度
 * @return int8_t 
 * - @b Success : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_NO_INIT - 串口没有初始化
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 */
int8_t UartSend( UartId_t uartId, uint8_t *buffer, uint16_t size );

/**
 * @brief UART格式化输出
 * @param  uartId      UART编号
 * @param  fmt         格式化字符串
 */
void UartPrintf( UartId_t uartId, char *fmt, ... );

/**
 * @brief UART接收
 * @param[in]  uartId       UART编号
 * @param[in]  buffer       接收缓存
 * @param[in]  size         接收长度（0：直接获取fifo长度）
 * @param[in]  blockTime    接收阻塞时间（0：直接轮询，portMAX_DELAY：不超时）
 * @return int32_t 
 * - @b Success : 实际FIFO长度 \n
 * - @b Fail
 * - @ref BSP_ERROR_NO_INIT - 串口没有初始化
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_TIMEOUT - 接收超时
 */
int32_t UartRecv( UartId_t uartId, uint8_t *buffer, uint16_t size, uint32_t blockTime );



#endif	 // __BSP_UART_V2_H 

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
